package com.gsbelarus.gedemin.lib.sync.protocol.etc;

import com.gsbelarus.gedemin.lib.sync.protocol.exception.AddressFailedException;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

/**
 * Анализатор данных
 */
final public class Parser {

    public static final String START_HEADER = "START_HEADER";
    public static final String END_HEADER = "END_HEADER";
    public static final String BLOCK_NUM = "block_num";

    private CSVReader csvHeader;

    public Parser() {
        csvHeader = new CSVReader('=');
    }

    /**
     * Метод для анализа заголовка блока.
     * Вид заголовка:
     * <br> {@link Parser#START_HEADER}
     * <br> {@link Parser#BLOCK_NUM}=value
     * <br> key=value
     * <br> key=value
     * <br> ...
     * <br> {@link Parser#END_HEADER}
     *
     * @param lines блок данных
     * @return параметр = значение.
     * @throws IOException
     * @throws IndexOutOfBoundsException
     */
    public HashMap<String, String> parsingHeader(List<String> lines) throws IOException, IndexOutOfBoundsException {
        HashMap<String, String> headerValues = new HashMap<>();
        if (!lines.isEmpty()) {

            if (!lines.get(0).contains(START_HEADER)) {
                throw new AddressFailedException("Начало заголовка должно быть - " + START_HEADER +
                        ". Ответ сервера:\n" + lines.get(0));
            }

            for (int i = 1; i < lines.size(); i++) {
                if (lines.get(i).contains(END_HEADER)) return headerValues;

                String[] p = csvHeader.parseLine(lines.get(i));
                headerValues.put(p[0], p[1]);
            }

        } else throw new IOException("Ответ сервера: null");
        return headerValues;
    }

    public void removeHeaderFromList(List<String> lines) {
        boolean isHeader = false;
        for (Iterator<String> iterator = lines.iterator(); iterator.hasNext(); ) {
            String line = iterator.next();
            if (line.contains(START_HEADER)) isHeader = true;
            if (isHeader) iterator.remove();
            if (line.contains(END_HEADER)) break;
        }
    }
}
